Πρόσφατα, έτρεξα μέρος του κώδικα JavaScript μέσω του Crockford's JSLint και έδωσε το ακόλουθο σφάλμα: Πρόβλημα στη γραμμή 1 χαρακτήρα 1: Λείπει η δήλωση "use ketat". Κάνοντας κάποια αναζήτηση, συνειδητοποίησα ότι μερικοί άνθρωποι προσθέτουν «χρήση αυστηρά» στον κώδικα JavaScript τους. Μόλις πρόσθεσα τη δήλωση, το σφάλμα σταμάτησε να εμφανίζεται. Δυστυχώς, η Google δεν αποκάλυψε μεγάλο μέρος του ιστορικού πίσω από αυτήν τη δήλωση συμβολοσειράς. Σίγουρα πρέπει να έχει σχέση με τον τρόπο ερμηνείας της JavaScript από το πρόγραμμα περιήγησης, αλλά δεν έχω ιδέα τι θα ήταν το αποτέλεσμα. Λοιπόν, τι είναι "αυστηρή χρήση"; όλα σχετικά, τι συνεπάγεται και εξακολουθεί να είναι σχετικό; Μήπως κάποιο από τα τρέχοντα προγράμματα περιήγησης ανταποκρίνεται στην "αυστηρή χρήση". χορδή ή είναι για μελλοντική χρήση;
2020-12-07 22:06:40
Αυτό το άρθρο σχετικά με τη λειτουργία Javascript Strict Mode μπορεί να σας ενδιαφέρει: John Resig - ECMAScript 5 Strict Mode, JSON και άλλα Για να παραθέσω μερικά ενδιαφέροντα μέρη: Το Strict Mode είναι μια νέα δυνατότητα στο ECMAScript 5 που σας επιτρέπει να τοποθετήσετε ένα πρόγραμμα ή μια συνάρτηση, σε ένα "αυστηρό" περιβάλλον λειτουργίας. Αυτό το αυστηρό πλαίσιο εμποδίζει τη λήψη ορισμένων ενεργειών και ρίχνει περισσότερες εξαιρέσεις. Και: Η αυστηρή λειτουργία βοηθά με δύο τρόπους: Παίρνει μερικά κοινά bloopers κωδικοποίησης, ρίχνοντας εξαιρέσεις. Αποτρέπει, ή ρίχνει σφάλματα, όταν λαμβάνονται σχετικά "μη ασφαλείς" ενέργειες (όπως η πρόσβαση στο καθολικό αντικείμενο). Απενεργοποιεί τις λειτουργίες που προκαλούν σύγχυση ή δεν είναι καλά μελετημένες. Σημειώστε επίσης ότι μπορείτε να εφαρμόσετε "αυστηρή λειτουργία" σε ολόκληρο το αρχείο ... Ή μπορείτε να το χρησιμοποιήσετε μόνο για μια συγκεκριμένη λειτουργία (εξακολουθεί να αναφέρεται από το άρθρο του John Resig): // Μη αυστηρός κωδικός ... (λειτουργία(){ "χρήση αυστηρών"; // Ορίστε αυστηρά τη βιβλιοθήκη σας ... }) (); // Μη αυστηρός κωδικός ... Που μπορεί να είναι χρήσιμο αν πρέπει να αναμίξετε παλιό και νέο κώδικα ;-) Λοιπόν, υποθέτω ότι μοιάζει λίγο με τη "αυστηρή χρήση" που μπορείτε να χρησιμοποιήσετε στο Perl (εξ ου και το όνομα;): σας βοηθά να κάνετε λιγότερα σφάλματα, εντοπίζοντας περισσότερα πράγματα που θα μπορούσαν να οδηγήσουν σε βλάβες. Η αυστηρή λειτουργία υποστηρίζεται πλέον από όλα τα μεγάλα προγράμματα περιήγησης. Μέσα στις εγγενείς λειτουργικές μονάδες ECMAScript (με δηλώσεις εισαγωγής και εξαγωγής) και τάξεις ES6, η αυστηρή λειτουργία είναι πάντα ενεργοποιημένη και δεν μπορεί να απενεργοποιηθεί. | Είναι ένα νέο χαρακτηριστικό του ECMAScript 5. Ο John Resig έγραψε μια ωραία περίληψη για αυτό. Είναι απλώς μια συμβολοσειρά που βάζετε στα αρχεία σας JavaScript (είτε στο επάνω μέρος του αρχείου σας είτε στο εσωτερικό μιας λειτουργίας) που μοιάζει με αυτό: "χρήση αυστηρών"; Η τοποθέτησή του στον κώδικά σας τώρα δεν πρέπει να προκαλεί προβλήματα με τα τρέχοντα προγράμματα περιήγησης, καθώς είναι απλώς μια συμβολοσειρά. Μπορεί να προκαλέσει προβλήματα με τον κωδικό σας στο μέλλον, εάν ο κώδικάς σας παραβιάζει το πραγματικό. Για παράδειγμα, αν έχετε αυτήν τη στιγμή foo = "bar" χωρίς να ορίσετε πρώτα το foo, ο κώδικάς σας θα αρχίσει να αποτυγχάνει ... κάτι που είναι καλό κατά τη γνώμη μου. | Η δήλωση "χρησιμοποιήστε αυστηρά". δίνει εντολή στο πρόγραμμα περιήγησης να χρησιμοποιήσει τη λειτουργία Αυστηρή, η οποία είναι ένα σύνολο μειωμένων και ασφαλέστερων δυνατοτήτων JavaScript. Λίστα χαρακτηριστικών (μη εξαντλητική) Δεν επιτρέπει καθολικές μεταβλητές. (Καταγράφει ελλείψεις δηλώσεων var και τυπογραφικών λάθους σε ονόματα μεταβλητών) Οι σιωπηλές αποτυχημένες αναθέσεις θα προκαλέσουν σφάλμα σε αυστηρή λειτουργία (εκχώρηση NaN = 5;) Θα προσπαθήσουν να διαγραφούν μη διαγράψιμες ιδιότητες (διαγραφή Object.prototype) Απαιτεί όλα τα ονόματα ιδιοτήτων σε ένα κυριολεκτικό αντικείμενο να είναι μοναδικά (var x = {x1: "1", x1: "2"}) Τα ονόματα των παραμέτρων συνάρτησης πρέπει να είναι μοναδικά (άθροισμα συνάρτησης (x, x) {...}) Απαγορεύει την οκταδική σύνταξη (var x = 023; ορισμένοι devs υποθέτουν λανθασμένα ότι το προηγούμενο μηδέν δεν κάνει τίποτα για να αλλάξει τον αριθμό.) Απαγορεύει τη λέξη-κλειδί Το eval σε αυστηρό τρόπο δεν εισάγει νέες μεταβλητές Απαγορεύει τη διαγραφή απλών ονομάτων (διαγραφή x;) Απαγορεύει τη δέσμευση ή εκχώρηση των ονομάτων eval και επιχειρήματα σε οποιαδήποτε μορφή Η αυστηρή λειτουργία δεν ψευδώνει τις ιδιότητες των αντικειμένων των ορισμάτων με τις τυπικές παραμέτρους. (δηλ. στο άθροισμα της συνάρτησης (a, b) {return επιχειρήματα [0] + b;} Λειτουργεί επειδή τα ορίσματα [0] συνδέονται με ένα και ούτω καθεξής.) δεν υποστηρίζεται το argument.callee [Ref: Αυστηρή λειτουργία, Mozilla Developer Network] | Εάν οι άνθρωποι ανησυχούν για τη χρήση αυστηρής, ίσως αξίζει να δείτε αυτό το άρθρο: Υποστήριξη ECMAScript 5 'Strict mode' στα προγράμματα περιήγησης. Τι σημαίνει αυτό; NovoGeek.com - Ιστολόγιο του Krishna Μιλά για την υποστήριξη του προγράμματος περιήγησης, αλλά το πιο σημαντικό είναι πώς να το αντιμετωπίσουμε με ασφάλεια: συνάρτηση isStrictMode () { επιστρέψτε! } / * επιστρέφει ψευδές, αφού το "αυτό" αναφέρεται σε παγκόσμιο αντικείμενο και «! αυτό» γίνεται ψευδές * / συνάρτηση isStrictMode () { "χρήση αυστηρών"; επιστρέψτε! } / * επιστρέφει αληθές, καθώς σε αυστηρή λειτουργία η λέξη-κλειδί «αυτό» δεν αναφέρεται σε παγκόσμιο αντικείμενο, σε αντίθεση με το παραδοσιακό JS. Εδώ λοιπόν, «αυτό» είναι «απροσδιόριστο» και «! Αυτό» γίνεται αλήθεια. * / | Προειδοποίηση, όλοι οι προγραμματιστές με μεγάλη φόρτιση: η εφαρμογή «αυστηρή χρήση» στον υπάρχοντα κώδικα μπορεί να είναι επικίνδυνη! Αυτό το πράγμα δεν είναι ένα αυτοκόλλητο χαρούμενου προσώπου που μπορείτε να χτυπήσετε στον κώδικα για να το κάνετε «καλύτερο». Με το "αυστηρό" pragma, το πρόγραμμα περιήγησης ξαφνικά θα ΑΝΑΚΑΛΥΨΕΙ εξαιρέσεις σε τυχαία μέρη που δεν έριξε ποτέ πριν, επειδή σε αυτό το σημείο κάνετε κάτι που η προεπιλεγμένη / χαλαρή JavaScript επιτρέπει με χαρά αλλά αυστηρή JavaScript αποφεύγει! Ενδέχεται να έχετε παραβιάσεις αυστηρότητας που κρύβονται σε κλήσεις που χρησιμοποιούνται σπάνια στον κώδικά σας, οι οποίες θα κάνουν εξαίρεση μόνο όταν τελικά εκτελούνται - ας πούμε, στο περιβάλλον παραγωγής που χρησιμοποιούν οι πελάτες σας που πληρώνουν! Εάν πρόκειται να πάρετε τη βουτιά, είναι καλή ιδέα να εφαρμόσετε "χρήση αυστηρού" παράλληλα με ολοκληρωμένες δοκιμές μονάδας και μια αυστηρά διαμορφωμένη εργασία κατασκευής JSHint που θα σας δώσει κάποια σιγουριά ότι δεν υπάρχει σκοτεινή γωνία της μονάδας σας που θα ανατινάξει τρομερά απλώς και μόνο επειδή έχετε ενεργοποιήσει το Strict Mode. Ή, hei, εδώ είναι μια άλλη επιλογή: απλώς μην προσθέσετε "χρήση αυστηρά" σε οποιονδήποτε από τους παλαιούς κωδικούς σας, είναι πιθανώς πιο ασφαλές με αυτόν τον τρόπο, ειλικρινά ΟΡΙΣΤΙΚΑ ΜΗΝ προσθέτετε "χρήση αυστηρά" σε μονάδες που δεν σας ανήκουν ήδιατηρήστε, όπως και τρίτα μέρη. Νομίζω ότι παρόλο που είναι ένα θανατηφόρο κλουβί ζώο, η "αυστηρή χρήση" μπορεί να είναι καλό πράγμα, αλλά πρέπει να το κάνετε σωστά. Ο καλύτερος χρόνος για να γίνεις αυστηροί είναι όταν το έργο σου είναι πράσινο και ξεκινάς από το μηδέν. Διαμορφώστε το JSHint / JSLint με όλες τις προειδοποιήσεις και τις επιλογές που είναι τόσο σφιχτές όσο η ομάδα σας μπορεί να στομαχίσει, να πάρει ένα καλό σύστημα κατασκευής / δοκιμής / διεκδίκησης, όπως το Grunt + Karma + Chai, και μόνο τότε αρχίστε να επισημαίνετε όλες τις νέες σας ενότητες ως " χρησιμοποιήστε αυστηρό ". Να είστε προετοιμασμένοι να θεραπεύσετε πολλά ασταθή λάθη και προειδοποιήσεις. Βεβαιωθείτε ότι όλοι καταλαβαίνουν τη βαρύτητα ρυθμίζοντας το build σε FAIL εάν το JSHint / JSLint προκαλέσει παραβιάσεις. Το πρόγραμμά μου δεν ήταν έργο Greenfield όταν υιοθέτησα "αυστηρή χρήση". Ως αποτέλεσμα, το IDE μου είναι γεμάτο κόκκινα σημάδια, επειδή δεν έχω «αυστηρή χρήση» στις μισές μονάδες μου και η JSHint παραπονιέται γι 'αυτό. Είναι μια υπενθύμιση για μένα σχετικά με το τι πρέπει να κάνω στο μέλλον. Ο στόχος μου είναι να μην είμαι κόκκινος, εξαιτίας όλων των ελλείψεων δηλώσεων "αυστηρή χρήση", αλλά αυτό είναι χρόνια τώρα. | Χρησιμοποιώντας «αυστηρή χρήση». δεν κάνει ξαφνικά τον κωδικό σας καλύτερο. Η αυστηρή λειτουργία JavaScript είναι μια δυνατότητα στο ECMAScript 5. Μπορείτε να ενεργοποιήσετε την αυστηρή λειτουργία δηλώνοντάς την στην κορυφή του σεναρίου / της λειτουργίας σας. «χρήση αυστηρών» · Όταν μια μηχανή JavaScript βλέπει αυτήν την οδηγία, θα αρχίσει να ερμηνεύει τον κώδικα σε ειδική λειτουργία. Σε αυτήν τη λειτουργία, εμφανίζονται σφάλματα όταν εντοπίζονται ορισμένες πρακτικές κωδικοποίησης που θα μπορούσαν να καταλήξουν σε πιθανά σφάλματα (που είναι ο λόγος πίσω από την αυστηρή λειτουργία). Εξετάστε αυτό το παράδειγμα: var a = 365; var b = 030; Στην εμμονή τους να ευθυγραμμίσουν τα αριθμητικά γράμματα, ο προγραμματιστής έχει αρχικά ακούσει τη μεταβλητή b με μια οκταδική κυριολεκτική. Η μη αυστηρή λειτουργία θα το ερμηνεύσει ως αριθμητικό γράμμα με την τιμή 24 (στη βάση 10). Ωστόσο, η αυστηρή λειτουργία θα προκαλέσει σφάλμα. Για μια μη εξαντλητική λίστα ειδικοτήτων σε αυστηρή λειτουργία, δείτε αυτήν την απάντηση. Πού πρέπει να χρησιμοποιήσω την «αυστηρή χρήση» ;; Στη νέα μου εφαρμογή JavaScript: Απολύτως! Η αυστηρή λειτουργία μπορεί να χρησιμοποιηθεί ως πληροφοριοδότη όταν κάνετε κάτι ηλίθιο με τον κωδικό σας. Στον υπάρχοντα κώδικα JavaScript: Πιθανώς όχι! Εάν ο υπάρχων κώδικας JavaScript περιέχει δηλώσεις που απαγορεύονται σε αυστηρή λειτουργία, η εφαρμογή απλώς θα σπάσει. Αν θέλετε αυστηρή λειτουργία, θα πρέπει να είστε προετοιμασμένοι να εντοπίσετε σφάλματα και να διορθώσετε τον υπάρχοντα κωδικό σας. Αυτός είναι ο λόγος για τον οποίο χρησιμοποιείτε το "use ketat". δεν ξαφνικά βελτιώνει τον κώδικά σας. Πώς χρησιμοποιώ αυστηρή λειτουργία; Εισαγάγετε μια «αυστηρή χρήση». δήλωση στην κορυφή του σεναρίου σας: // Αρχείο: myscript.js «χρήση αυστηρών» · var a = 2; .... Σημειώστε ότι όλα στο αρχείο myscript.js θα ερμηνευθούν σε αυστηρή λειτουργία. Ή, εισαγάγετε μια «αυστηρή χρήση». δήλωση πάνω από το σώμα της λειτουργίας σας: συνάρτηση doSomething () { «χρήση αυστηρών» · ... } Τα πάντα στο λεξικό πεδίο της συνάρτησης doSomething θα ερμηνευθούν σε αυστηρή λειτουργία. Η λέξη λεξική εμβέλεια είναι σημαντική εδώ. Για παράδειγμα, εάν ο αυστηρός κωδικός σας καλεί μια λειτουργία μιας βιβλιοθήκης που δεν είναι αυστηρή, μόνο ο κώδικάς σας εκτελείται σε αυστηρή λειτουργία και όχι η λειτουργία που ονομάζεται. Δείτε αυτήν την απάντηση για καλύτερη εξήγηση. Ποια πράγματα απαγορεύονται σε αυστηρή λειτουργία; Βρήκα ένα ωραίο άρθρο που περιγράφει πολλά πράγματα που απαγορεύονται σε αυστηρή λειτουργία (σημειώστε ότι δεν πρόκειται για αποκλειστική λίστα): Πεδίο εφαρμογής Ιστορικά, η JavaScript έχει μπερδευτεί για το πώς λειτουργεί καλύπτονται. Μερικές φορές φαίνεται να είναι στατικά, αλλά μερικές τα χαρακτηριστικά τους κάνουν να συμπεριφέρονται σαν να είναι δυναμικά. Αυτό είναι σύγχυση, καθιστώντας τα προγράμματα δυσανάγνωστα και κατανοητά. Η παρανόηση προκαλεί σφάλματα. Είναι επίσης πρόβλημα για την απόδοση. Το στατικό εύρος θα επιτρέψει τη μεταβλητή δέσμευση να συμβεί στο compile χρόνος, αλλά η απαίτηση για δυναμικό πεδίο σημαίνει ότι η δέσμευση πρέπει να είναι αναβάλλεται στο χρόνο εκτέλεσης, το οποίο συνοδεύεται από σημαντική απόδοση ποινή. Η αυστηρή λειτουργία απαιτεί τη σύνδεση όλων των μεταβλητών. Αυτό σημαίνει ότι τα χαρακτηριστικά που προηγουμένως απαιτούσαν δυναμική σύνδεση πρέπει να εξαλειφθεί ή να τροποποιηθεί. Συγκεκριμένα, η με δήλωση είναι εξαλειφθεί και η ικανότητα της λειτουργίας eval να παραβιάσει το περιβάλλον του καλούντος είναι αυστηρά περιορισμένο. Ένα από τα πλεονεκτήματα του αυστηρού κώδικα είναι ότι εργαλεία όπως το YUI Compressor μπορεί να κάνει καλύτερη δουλειά κατά την επεξεργασία του. Σιωπηρές καθολικές μεταβλητές Το JavaScript έχει υπονοεί καθολικές μεταβλητές. Αν δεν δηλώνετε ρητά μια μεταβλητή, μια καθολική μεταβλητή είναι δηλώνεται σιωπηρά για εσάς. Αυτό διευκολύνει τον προγραμματισμό αρχάριοι επειδή μπορούν να παραμελήσουν μερικά από τα βασικά τους νοικοκυριά μικροδουλειές. Αλλά κάνει τη διαχείριση μεγαλύτερων προγραμμάτων πολύ περισσότερο δύσκολο και υποβαθμίζει σημαντικά την αξιοπιστία. Τόσο αυστηρά λειτουργία, οι σιωπηρές καθολικές μεταβλητές δεν δημιουργούνται πλέον. Θα έπρεπε δηλώστε ρητά όλες τις μεταβλητές σας. Παγκόσμια διαρροή Υπάρχουν ορισμένες καταστάσεις που θα μπορούσαν να το προκαλέσουν να συνδεθείτε με το παγκόσμιο αντικείμενο. Για παράδειγμα, αν ξεχάσετε παρέχετε το νέο πρόθεμα κατά την κλήση ενός κατασκευαστήσυνάρτηση, το κατασκευαστής αυτό θα συνδέεται απροσδόκητα με το παγκόσμιο αντικείμενο, έτσι Αντί να αρχίσει ένα νέο αντικείμενο, θα είναι σιωπηλά παραβίαση των καθολικών μεταβλητών. Σε αυτές τις περιπτώσεις, η αυστηρή λειτουργία θα Αντ 'αυτού, δεσμεύστε το σε απροσδιόριστο, κάτι που θα προκαλέσει τον κατασκευαστή ρίξτε μια εξαίρεση αντ 'αυτού, επιτρέποντας το σφάλμα να εντοπιστεί πολύ γρηγορότερα. Θορυβώδης αποτυχία Το JavaScript είχε πάντα ιδιότητες μόνο για ανάγνωση, αλλά εσείς δεν μπορούσα να τα δημιουργήσω μόνοι σας μέχρι το Object.createProperty του ES5 η λειτουργία εκτέθηκε αυτή η ικανότητα. Εάν επιχειρήσατε να εκχωρήσετε μια τιμή σε μια ιδιότητα μόνο για ανάγνωση, θα αποτύχει σιωπηλά. Η ανάθεση θα να μην αλλάξετε την τιμή της ιδιότητας, αλλά το πρόγραμμά σας θα προχωρήσει ως αν και είχε. Πρόκειται για κίνδυνο ακεραιότητας που μπορεί να προκαλέσει προγράμματα πάει σε μια ασυνεπή κατάσταση. Σε αυστηρή λειτουργία, απόπειρα αλλαγής α Η ιδιότητα μόνο για ανάγνωση θα αποτελεί εξαίρεση. Οκτάεδρος Η οκταδική (ή βάση 8) αναπαράσταση των αριθμών ήταν εξαιρετικά χρήσιμο όταν κάνετε προγραμματισμό επιπέδου μηχανής σε μηχανήματα των οποίων η λέξη τα μεγέθη ήταν πολλαπλάσιο του 3. Χρειάζεστε οκτάλη όταν εργάζεστε με το CDC 6600 mainframe, το οποίο είχε μέγεθος λέξης 60 bit. Αν μπορούσατε να διαβάσετε οκτάλη, θα μπορούσατε να δείτε μια λέξη ως 20 ψηφία. Αντιπροσωπεύονται δύο ψηφία ο κώδικας op και ένα ψηφίο αναγνώρισαν έναν από τους 8 καταχωρητές. Κατά τη διάρκεια της αργή μετάβαση από κωδικούς μηχανής σε γλώσσες υψηλού επιπέδου, ήταν πιστεύεται ότι είναι χρήσιμο να παρέχει οκταδικές φόρμες σε γλώσσες προγραμματισμού. Στο C, ήταν μια εξαιρετικά ατυχής αναπαράσταση της οκταλότητας επιλεγμένο: Κορυφαίο μηδέν. Έτσι στο C, 0100 σημαίνει 64, όχι 100, και το 08 είναι ένα σφάλμα, όχι 8. Ακόμα πιο δυστυχώς, αυτός ο αναχρονισμός ήταν αντιγράφηκαν σε όλες σχεδόν τις σύγχρονες γλώσσες, συμπεριλαμβανομένης της JavaScript, όπου χρησιμοποιείται μόνο για τη δημιουργία σφαλμάτων. Δεν έχει άλλο σκοπό. Έτσι μέσα αυστηρή λειτουργία, οι οκταδικές μορφές δεν επιτρέπονται πλέον. Και τα λοιπά Ο πίνακας ψευδώνυμων επιχειρημάτων γίνεται λίγο περισσότερο σαν πίνακας στο ES5. Σε αυστηρή λειτουργία, χάνει τον καλούντα και τον καλούντα ιδιότητες. Αυτό καθιστά δυνατή τη μετάδοση των επιχειρημάτων σας σε μη αξιόπιστα κώδικα χωρίς να εγκαταλείπετε πολύ εμπιστευτικό πλαίσιο. Επίσης το ορίσματα ιδιότητα των συναρτήσεων εξαλείφεται. Σε αυστηρή λειτουργία, τα διπλά πλήκτρα σε μια κυριολεκτική συνάρτηση θα παράγουν ένα συντακτικό λάθος. Μια συνάρτηση δεν μπορεί να έχει δύο παραμέτρους με το ίδιο όνομα. Μια συνάρτηση δεν μπορεί να έχει μεταβλητή με το ίδιο όνομα με μία Παράμετροι. Μια συνάρτηση δεν μπορεί να διαγράψει τις δικές της μεταβλητές. Μια προσπάθεια να διαγράψτε μια μη διαμορφώσιμη ιδιότητα ρίχνει τώρα μια εξαίρεση. Πρωτόγονος οι τιμές δεν είναι σιωπηρά τυλιγμένες. Διατηρημένες λέξεις για μελλοντικές εκδόσεις JavaScript Το ECMAScript 5 προσθέτει μια λίστα δεσμευμένων λέξεων. Εάν τις χρησιμοποιήσετε ως μεταβλητές ή επιχειρήματα, η αυστηρή λειτουργία θα προκαλέσει σφάλμα. Οι δεσμευμένες λέξεις είναι: υλοποιεί, διεπαφή, αφήστε, πακέτο, ιδιωτικό, προστατευμένο, δημόσιο, στατικό και απόδοση Περαιτέρω ανάγνωση Αυστηρή λειτουργία - JavaScript | MDN Υποστήριξη προγράμματος περιήγησης για αυστηρή λειτουργία Μετάβαση σε αυστηρό τρόπο | Συνιστώ ανεπιφύλακτα σε κάθε προγραμματιστή να αρχίσει να χρησιμοποιεί αυστηρή λειτουργία τώρα. Υπάρχουν αρκετά προγράμματα περιήγησης που το υποστηρίζουν ότι η αυστηρή λειτουργία θα μας βοηθήσει νόμιμα να μας σώσει από σφάλματα που δεν γνωρίζαμε καν ότι ήταν στον κώδικά σας Προφανώς, στο αρχικό στάδιο θα υπάρχουν σφάλματα που δεν έχουμε συναντήσει ποτέ πριν. Για να επωφεληθούμε πλήρως, πρέπει να κάνουμε σωστές δοκιμές μετά από μετάβαση σε αυστηρή λειτουργία για να βεβαιωθούμε ότι έχουμε πιάσει τα πάντα. Σίγουρα δεν απλώς ρίχνουμε αυστηρή χρήση στον κώδικα μας και υποθέτουμε ότι δεν υπάρχουν σφάλματα. Επομένως, η ώρα είναι ότι ήρθε η ώρα να αρχίσετε να χρησιμοποιείτε αυτήν την εξαιρετικά χρήσιμη λειτουργία γλώσσας για να γράψετε καλύτερο κώδικα. Για παράδειγμα, var άτομο = { όνομα: «xyz», θέση: 'abc', fullname: function () {"χρησιμοποιήστε αυστηρά"; επιστρέψτε αυτό. όνομα; } }; Το JSLint είναι ένα πρόγραμμα εντοπισμού σφαλμάτων που γράφτηκε από τον Douglas Crockford. Απλώς επικολλήστε το σενάριό σας και θα σαρώσει γρήγορα για τυχόν εμφανή ζητήματα και σφάλματα στον κώδικά σας. | Θα ήθελα να προσφέρω μια κάπως πιο θεμελιωμένη απάντηση συμπληρώνοντας τις άλλες απαντήσεις. Ήλπιζα να επεξεργαστώ την πιο δημοφιλή απάντηση, αλλά απέτυχα. Προσπάθησα να το κάνω όσο πιο ολοκληρωμένο και πλήρες μπορούσα. Μπορείτε να ανατρέξετε στην τεκμηρίωση MDN για περισσότερες πληροφορίες. "χρησιμοποιήστε αυστηρά" μια οδηγία που εισήχθη στο ECMAScript 5. Οι οδηγίες είναι παρόμοιες με δηλώσεις, αλλά διαφορετικές. η χρήση αυστηρού δεν περιέχει λέξεις κλειδιά: Η οδηγία είναι μια απλή δήλωση έκφρασης, η οποία αποτελείται από μια ειδική γραμματοσειρά συμβολοσειράς (σε μεμονωμένα ή διπλά εισαγωγικά). Οι μηχανές JavaScript, που δεν εφαρμόζουν το ECMAScript 5, βλέπουν απλά μια δήλωση έκφρασης χωρίς παρενέργειες. Αναμένεται ότι οι μελλοντικές εκδόσεις των προτύπων ECMAScript εισάγουν τη χρήση ως πραγματική λέξη κλειδί. Έτσι, τα αποσπάσματα θα καταστούν άνευ αντικειμένου. Η χρήση αυστηρού μπορεί να χρησιμοποιηθεί μόνο στην αρχή ενός σεναρίου ή μιας συνάρτησης, δηλαδή πρέπει να προηγείται κάθε άλλης (πραγματικής) δήλωσης. Δεν πρέπει να είναι η πρώτη εντολή σε ένα σενάριο συνάρτησης: μπορεί να προηγηθεί άλλη έκφραση δήλωσης που αποτελείται από γραμματοσειρά συμβολοσειράς (και JavaScriptοι υλοποιήσεις μπορούν να τις αντιμετωπίσουν ως οδηγίες εφαρμογής. Οι συμβολοσειρές γραμματικές δηλώσεις, οι οποίες ακολουθούν μια πρώτη πραγματική δήλωση (σε ένα σενάριο ή συνάρτηση) είναι απλές δηλώσεις έκφρασης. Οι διερμηνείς δεν πρέπει να τις ερμηνεύουν ως οδηγίες και δεν έχουν καμία επίδραση. Η αυστηρή οδηγία χρήσης δείχνει ότι ο ακόλουθος κώδικας (σε σενάριο ή συνάρτηση) είναι αυστηρός κωδικός. Ο κωδικός στο υψηλότερο επίπεδο ενός σεναρίου (κωδικός που δεν βρίσκεται σε λειτουργία) θεωρείται αυστηρός κώδικας όταν το σενάριο περιέχει αυστηρή οδηγία χρήσης. Το περιεχόμενο μιας συνάρτησης θεωρείται αυστηρός κωδικός όταν η ίδια η συνάρτηση ορίζεται σε έναν αυστηρό κώδικα ή όταν η συνάρτηση περιέχει μια αυστηρή οδηγία χρήσης. Κωδικός που μεταφέρεται σε μια μέθοδο eval () θεωρείται αυστηρός κώδικας όταν το eval () κλήθηκε από έναν αυστηρό κωδικό ή περιέχει την ίδια την αυστηρή οδηγία χρήσης Η αυστηρή λειτουργία του ECMAScript 5 είναι ένα περιορισμένο υποσύνολο της γλώσσας JavaScript, το οποίο εξαλείφει τα σχετικά ελλείμματα της γλώσσας και διαθέτει πιο αυστηρό έλεγχο σφαλμάτων και μεγαλύτερη ασφάλεια. Παρακάτω παρατίθενται οι διαφορές μεταξύ αυστηρής και κανονικής λειτουργίας (εκ των οποίων οι τρεις πρώτες είναι ιδιαίτερα σημαντικές): Δεν μπορείτε να χρησιμοποιήσετε τη δήλωση με σε αυστηρή λειτουργία. Σε αυστηρή λειτουργία, όλες οι μεταβλητές πρέπει να δηλωθούν: εάν εκχωρήσετε μια τιμή σε ένα αναγνωριστικό που δεν έχει δηλωθεί ως μεταβλητή, συνάρτηση, παράμετρος συνάρτησης, παράμετρος catch-clause ή ιδιότητα του καθολικού αντικειμένου, τότε θα λάβετε ένα σφάλμα αναφοράς. Σε κανονική λειτουργία, το αναγνωριστικό δηλώνεται σιωπηρά ως καθολική μεταβλητή (ως ιδιότητα του καθολικού αντικειμένου) Σε αυστηρή λειτουργία, η λέξη-κλειδί έχει την τιμή που δεν καθορίζεται σε συναρτήσεις που επικαλούνται ως συναρτήσεις (όχι ως μέθοδοι). (Στην κανονική λειτουργία, αυτό δείχνει πάντα το παγκόσμιο αντικείμενο). Αυτή η διαφορά μπορεί να χρησιμοποιηθεί για να ελέγξει εάν μια εφαρμογή υποστηρίζει την αυστηρή λειτουργία: var hasStrictMode = (function () {"use ketat"; επιστρέψτε αυτό === undefined} ()); Επίσης, όταν καλείται μια συνάρτηση με κλήση () ή εφαρμόζεται σε αυστηρή λειτουργία, τότε αυτή είναι ακριβώς η αξία του πρώτου ορίσματος της κλήσης () ή εφαρμόζεται () (Στην κανονική λειτουργία, το null και το undefined αντικαθίστανται από το καθολικό αντικείμενο και οι τιμές, που δεν είναι αντικείμενα, μεταφέρονται σε αντικείμενα.) Σε αυστηρή λειτουργία θα λάβετε TypeError, όταν προσπαθείτε να αντιστοιχίσετε σε ιδιότητες μόνο για ανάγνωση ή να ορίσετε νέες ιδιότητες για ένα μη επεκτάσιμο αντικείμενο. (Στην κανονική λειτουργία και οι δύο απλώς αποτυγχάνουν χωρίς μήνυμα σφάλματος.) Σε αυστηρή λειτουργία, κατά τη μετάδοση κώδικα στο eval (), δεν μπορείτε να δηλώσετε ή να ορίσετε μεταβλητές ή λειτουργίες στο πεδίο εφαρμογής του καλούντος (όπως μπορείτε να το κάνετε σε κανονική λειτουργία). Αντ 'αυτού, δημιουργείται ένα νέο πεδίο εφαρμογής για eval () και οι μεταβλητές και οι συναρτήσεις βρίσκονται εντός αυτού του πεδίου. Αυτό το εύρος καταστρέφεται μετά την ολοκλήρωση της εκτέλεσης () Σε αυστηρή λειτουργία τα ορίσματα-αντικείμενο μιας συνάρτησης περιέχει ένα στατικό αντίγραφο των τιμών, οι οποίες μεταβιβάζονται σε αυτήν τη συνάρτηση. Σε κανονική λειτουργία, τα επιχειρήματα-αντικείμενο έχουν μια κάπως «μαγική» συμπεριφορά: Τα στοιχεία του πίνακα και οι ονομαζόμενες παράμετροι συνάρτησης αναφέρονται και στην ίδια τιμή. Σε αυστηρή λειτουργία θα λάβετε ένα SyntaxError όταν ο τελεστής διαγραφής ακολουθείται από ένα μη αναγνωρισμένο αναγνωριστικό (παράμετρος μεταβλητής, συνάρτησης ή λειτουργίας). Σε κανονική λειτουργία, η έκφραση διαγραφής δεν θα έκανε τίποτα και αξιολογείται ως ψευδής. Σε αυστηρή λειτουργία, θα λάβετε ένα TypeError όταν προσπαθείτε να διαγράψετε μια μη διαμορφώσιμη ιδιότητα. (Σε κανονική λειτουργία η προσπάθεια απλώς αποτυγχάνει και η έκφραση διαγραφής αξιολογείται ως ψευδής). Σε αυστηρή λειτουργία θεωρείται συντακτικό σφάλμα όταν προσπαθείτε να ορίσετε πολλές ιδιότητες με το ίδιο όνομα για ένα κυριολεκτικό αντικείμενο. (Στην κανονική λειτουργία δεν υπάρχει σφάλμα.) Σε αυστηρή λειτουργία θεωρείται συντακτικό σφάλμα όταν μια δήλωση συνάρτησης έχει πολλές παραμέτρους με το ίδιο όνομα. (Στην κανονική λειτουργία δεν υπάρχει σφάλμα.) Σε αυστηρή λειτουργία δεν επιτρέπονται οκταδικά γράμματα (αυτά είναι κυριολεκτικά που ξεκινούν με 0x. (Στην κανονική λειτουργία ορισμένες εφαρμογές επιτρέπουν οκταδικά γράμματα.) Σε αυστηρή λειτουργία τα αναγνωριστικά eval και επιχειρήματα αντιμετωπίζονται σαν λέξεις-κλειδιά. Δεν μπορείτε να αλλάξετε την τιμή τους, δεν μπορείτε να τους εκχωρήσετε μια τιμή και δεν μπορείτε να τις χρησιμοποιήσετε ως ονόματα για μεταβλητές, συναρτήσεις, παραμέτρους λειτουργίας ή αναγνωριστικά ενός μπλοκ catch. Στην αυστηρή λειτουργία υπάρχουν περισσότεροι περιορισμοί στις δυνατότητες εξέτασης της στοίβας κλήσεων. argumen.caller και argumen.callee προκαλούν TypeError σε μια συνάρτηση σε αυστηρή λειτουργία. Επιπλέον, ορισμένες ιδιότητες καλούντος και ορίσματος των λειτουργιών σε αυστηρή λειτουργία προκαλούν TypeError όταν προσπαθείτε να τις διαβάσετε. | Τα δύο σεντ μου: Ένας από τους στόχους της αυστηρής λειτουργίας είναι να επιτρέψει ταχύτερο εντοπισμό σφαλμάτων ζητημάτων. Βοηθά τους προγραμματιστές να ρίχνουν εξαίρεση όταν συμβαίνουν ορισμένα λανθασμένα πράγματα που μπορούν να προκαλέσουν σιωπηλή και παράξενη συμπεριφορά της ιστοσελίδας σας. Τη στιγμή που χρησιμοποιούμε αυστηρή, ο κώδικας θα πετάξει σφάλματα που βοηθούν τον προγραμματιστή να το διορθώσει εκ των προτέρων. Λίγα σημαντικά πράγματα που έχω μάθει μετά τη χρήση αυστηρά: Αποτρέπει την καθολική μεταβλητή δήλωση: var tree1Data= {όνομα: 'Μπανάνα', ηλικία: 100, φύλλα Αριθμός: 100000}; Λειτουργία Tree (typeOfTree) { var ηλικία; var leafCount; ηλικία = typeOfTree.age; leafCount = typeOfTree.leafCount; nameoftree = typeOfTree.name; }; var tree1 = νέο δέντρο (tree1Data); console.log (παράθυρο); Τώρα, αυτός ο κώδικας δημιουργεί το όνομαoftree σε παγκόσμιο πεδίο στο οποίο θα μπορούσε να προσπελαστεί χρησιμοποιώντας το window.nameoftree Όταν εφαρμόζουμε τη χρήση αυστηρά, ο κώδικας θα ρίξει λάθος. Uncaught ReferenceError: το nameoftree δεν έχει οριστεί Δείγμα Εξαλείφεται με δήλωση: με δηλώσεις δεν μπορούν να ελαχιστοποιηθούν χρησιμοποιώντας εργαλεία όπως το uglify-js. Καταργούνται επίσης και καταργούνται από μελλοντικές εκδόσεις JavaScript. Δείγμα Αποτρέπει διπλότυπα: Όταν έχουμε διπλή ιδιότητα, ρίχνει μια εξαίρεση Uncaught SyntaxError: Διπλότυπη ιδιότητα δεδομένων σε αντικείμενο κυριολεκτικά όχι επιτρέπεται σε αυστηρή λειτουργία "χρήση αυστηρών"; var tree1Data = { όνομα: «Μπανάνα», ηλικία: 100, φύλλα Αριθμός: 100000, όνομα: «Μπανάνα» }; Υπάρχουν λίγα ακόμη, αλλά πρέπει να αποκτήσω περισσότερες γνώσεις σχετικά με αυτό. | Εάν χρησιμοποιείτε πρόγραμμα περιήγησης που κυκλοφόρησε τον τελευταίο χρόνο περίπου, τότε πιθανότατα υποστηρίζει τη λειτουργία JavaScript Strict. Μόνο παλαιότερα προγράμματα περιήγησης πριν από το ECMAScript 5 έγινε το τρέχον πρότυπο δεν το υποστηρίζουν. Τα εισαγωγικά γύρω από την εντολή διασφαλίζουν ότι ο κώδικας θα εξακολουθήσει να λειτουργεί και σε παλαιότερα προγράμματα περιήγησης (αν και τα πράγματα που δημιουργούν σφάλμα σύνταξης σε αυστηρή λειτουργία γενικά απλώς θα προκαλέσουν δυσλειτουργία του σεναρίου με κάποιο δύσκολο τρόπο ανίχνευσης σε αυτά τα παλαιότερα προγράμματα περιήγησης). | Κατά την προσθήκη "use ketat" ;, οι ακόλουθες περιπτώσεις θα εμφανίσουν ένα SyntaxError πριν από την εκτέλεση του σεναρίου: Ανοίγοντας το δρόμο για μελλοντικές εκδόσεις ECMAScript, χρησιμοποιώντας μία από τις πρόσφατα δεσμευμένες λέξεις-κλειδιά (σε προεπισκόπηση για το ECMAScript 6): εργαλεία, διεπαφή, αφήστε, πακέτο, ιδιωτικά, προστατευμένα, δημόσια, στατικά και απόδοση Δήλωση λειτουργίας σε μπλοκ αν (a : 3: 15) στο: 6: 5 Εδώ, ο μεταγλωττιστής ρίχνει το σφάλμα αναφοράς. Σε αυστηρή λειτουργία, ο μεταγλωττιστής δεν μας επιτρέπει να χρησιμοποιήσουμε τη μεταβλητή χωρίς να την δηλώσουμε. Έτσι, οι διαρροές μνήμης μπορούν να αποφευχθούν. Επιπλέον, μπορούμε να γράψουμε πιο βελτιστοποιημένο κώδικα. | Η αυστηρή λειτουργία εξαλείφει τα λάθη που θα αγνοούνται σε μη αυστηρή λειτουργία, καθιστώντας έτσι το javascript «πιο ασφαλές». Θεωρείται μεταξύ των βέλτιστων πρακτικών; Ναι, θεωρείται μέρος των βέλτιστων πρακτικών ενώ εργάζεστε με javascript για να συμπεριλάβετε την αυστηρή λειτουργία. Αυτό γίνεται προσθέτοντας την παρακάτω γραμμή κώδικα στο αρχείο JS. «χρήση αυστηρών» · στον κωδικό σας. Τι σημαίνει για τους πράκτορες χρηστών; Η ένδειξη ότι ο κώδικας πρέπει να ερμηνεύεται σε αυστηρή λειτουργία καθορίζει σε πράκτορες χρηστών όπως τα προγράμματα περιήγησης ότι πρέπει να αντιμετωπίζουν τον κώδικα κυριολεκτικά ως γραπτό και να ρίχνουν ένα σφάλμα εάν ο κώδικας δεν έχει νόημα. Για παράδειγμα: Σκεφτείτε ότι στο αρχείο .js έχετε τον ακόλουθο κωδικό: Σενάριο 1: [ΟΧΙ ΤΡΕΧΟΣ ΛΕΙΤΟΥΡΓΙΑ] var city = "Σικάγο" console.log (city) // Εκτυπώνει το όνομα της πόλης, δηλαδή το Σικάγο Σενάριο 2: [ΟΧΙ ΑΡΙΘΜΟΣ ΛΕΙΤΟΥΡΓΙΑ] πόλη = "Σικάγο" console.log (city) // Εκτυπώνει το όνομα της πόλης, δηλαδή το Σικάγο Γιατί λοιπόν εκτυπώνεται το όνομα της μεταβλητής και στις δύο περιπτώσεις; Χωρίς ενεργοποιημένη την αυστηρή λειτουργία, οι πράκτορες χρηστών περνούν συχνά μια σειρά τροποποιήσεων σε προβληματικό κώδικα σε μια προσπάθεια να τον καταστήσει λογικό. Στην επιφάνεια, αυτό μπορεί να φαίνεται ωραίο, και πράγματι, η εργασία εκτός αυστηρής λειτουργίας επιτρέπει στους ανθρώπους να βρέξουν τα πόδια τους με κώδικα JavaScript χωρίς να έχουν όλα τα στοιχεία αρκετά καλά. Ωστόσο, ως προγραμματιστής, δεν θέλω να αφήσω ένα σφάλμα στον κώδικά μου, γιατί ξέρω ότι θα μπορούσε να επιστρέψει και να με δαγκώσει αργότερα και θέλω επίσης να γράψω καλό κώδικα. Και εκεί βοηθάει η αυστηρή λειτουργία. Σενάριο 3: [STRICT MODE] «χρήση αυστηρών» · πόλη = "Σικάγο" console.log (city) // Σφάλμα αναφοράς: η εκχώρηση είναι μη δηλωμένη μεταβλητή πόλη. Πρόσθετη συμβουλή: Για να διατηρήσετε την ποιότητα του κώδικα χρησιμοποιώντας αυστηρή λειτουργία, δεν χρειάζεται να το γράφετε ξανά και ξανά, ειδικά εάν έχετε πολλά αρχεία .js Μπορείτε να εφαρμόσετε αυτόν τον κανόνα παγκοσμίως σε κανόνες eslint ως εξής: Όνομα αρχείου: .eslintrc.js module.exports = { env: { es6: αλήθεια }, κανόνες: { αυστηρή: ['error', 'global'], }, }; Εντάξει, λοιπόν τι αποτρέπεται σε αυστηρή λειτουργία; Χρησιμοποιώντας μια μεταβλητή χωρίς να δηλώσετε θα ρίξει ένα σφάλμα σε αυστηρή λειτουργία. Αυτό γίνεται για να αποτρέψετε την ακούσια δημιουργία καθολικών μεταβλητών σε ολόκληρη την εφαρμογή σας. Το παράδειγμα με την εκτύπωση του Σικάγου το καλύπτει συγκεκριμένα. Η διαγραφή μιας μεταβλητής ή μιας συνάρτησης ή ενός ορίσματος είναι μη-σε αυστηρή λειτουργία. "χρήση αυστηρών"; συνάρτηση x (p1, p2) {}; διαγραφή x; // Αυτό θα προκαλέσει σφάλμα Δεν επιτρέπεται η αναπαραγωγή ονόματος παραμέτρου σε αυστηρή λειτουργία. "χρήση αυστηρών"; συνάρτηση x (p1, p1) {}; // Αυτό θα προκαλέσει σφάλμα Οι δεσμευμένες λέξεις στη γλώσσα Javascript δεν επιτρέπονται σε αυστηρή λειτουργία. Οι λέξεις είναι εργαλεία διεπαφής, αφήστε, πακέτα, ιδιωτικά, προστατευμένα, δημόσια. στατικό και απόδοση Για μια πιο ολοκληρωμένη λίστα, δείτε την τεκμηρίωση MDN εδώ: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode | Πολύ ενεργή ερώτηση. Κερδίστε 10 φήμη για να απαντήσετε σε αυτήν την ερώτηση. Η απαίτηση φήμης συμβάλλει στην προστασία αυτής της ερώτησης από ανεπιθύμητες ενέργειες και μη απαντήσεις. Δεν είναι η απάντηση που ψάχνετε; Περιηγηθείτε σε άλλες ερωτήσεις με ετικέτα javascript syntax jslint use-ketat ή κάντε την ερώτησή σας.